home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok31.lha
/
Thermic
/
Therm.mod
< prev
next >
Wrap
Text File
|
1993-08-15
|
8KB
|
237 lines
(*---------------------------------------------------------------------------
:Program. Thermic
:Contants. Simulation von Wärmeausbreitung
:Remark. very simple
:Author. Markus Peuckert
:Address. Schützenstr. 50, D-3550 Marburg, West-Germany,
:History. V1.0, Markus Peuckert, Oct-89
:Copyright. PD
:Language. Modula-2
:Translator. M2Amiga V3.2d
---------------------------------------------------------------------------*)
MODULE Therm;
FROM SYSTEM IMPORT INLINE, ADR, ADDRESS;
FROM Arts IMPORT Assert, TermProcedure, CurrentLevel, BreakPoint;
FROM Intuition IMPORT ScreenPtr, WindowPtr, WindowFlags, WindowFlagSet,
ScreenFlags, ScreenFlagSet, customScreen, RemakeDisplay,
SetPointer, IDCMPFlagSet, IDCMPFlags, CloseWindow,
CloseScreen, NewScreen,NewWindow,OpenScreen,
OpenWindow;
FROM Graphics IMPORT ViewModes, ViewModeSet, LoadRGB4, ViewPortPtr,
RastPortPtr, SetAPen, RectFill, Move, WritePixel;
FROM Exec IMPORT WaitPort;
CONST WIDTH = 320;
HEIGHT = 256;
DEPTH = 5;
MaxSeg = 50;
TYPE Segment = RECORD
Temp,
Farbe,
x, y,
dx, dy : INTEGER;
reserved : BOOLEAN;
END;
StangTyp= ARRAY [0..MaxSeg], [0..MaxSeg] OF Segment;
VAR Level : INTEGER;
scr : ScreenPtr;
win : WindowPtr;
rp : RastPortPtr;
vp : ViewPortPtr;
Stange : StangTyp;
PROCEDURE CreateScreen (w,h,d : INTEGER; vm : ViewModeSet; t,gad : ADDRESS)
: ScreenPtr;
VAR ns : NewScreen;
scr : ScreenPtr;
BEGIN
WITH ns DO
leftEdge:=0; topEdge:=0; width:=w; height:=h; depth:=d; detailPen:=0;
blockPen:=1; viewModes:=vm; type:=customScreen;font:=NIL; defaultTitle:=t;
gadgets:=gad; customBitMap:=NIL
END;
scr := OpenScreen (ns);
Assert (scr#NIL, ADR("Kein Schirm"));
RETURN scr
END CreateScreen;
PROCEDURE CreateWindow(x,y,w,h : INTEGER; if: IDCMPFlagSet; wf: WindowFlagSet;
gad,scr,tit : ADDRESS; typ : ScreenFlagSet) : WindowPtr;
VAR
nw : NewWindow;
win : WindowPtr;
BEGIN
WITH nw DO
leftEdge:=x; topEdge:=y; width:=w; height:=h; detailPen:=0; blockPen:=1;
idcmpFlags:=if; flags:=wf; firstGadget:=gad; checkMark:=NIL; title:=tit;
screen:=scr; bitMap:=NIL; minWidth:=160; minHeight:=14; maxWidth:=w;
maxHeight:=h; type:=typ
END;
win := OpenWindow(nw);
Assert (win#NIL, ADR("Kein Fenster"));
RETURN win
END CreateWindow;
PROCEDURE FarbTest;
VAR i : INTEGER;
BEGIN
FOR i:=0 TO 31 DO
SetAPen (rp, i);
RectFill (rp, 40+i*5, 0, 45+i*5, 10);
END
END FarbTest;
PROCEDURE Zeichne (SegX, SegY : INTEGER);
VAR err : INTEGER;
BEGIN
WITH Stange[SegX][SegY] DO
SetAPen (rp, Farbe);
RectFill (rp, x, y, dx, dy);
END
END Zeichne;
PROCEDURE Process;
CONST MaxTemp = 1000;
VAR a, xx, yy,
FarbFak, TempHelp : INTEGER;
BEGIN
Stange [0][0].Temp := MaxTemp; Stange[0][0].Farbe := 31;
Stange[0][0].reserved := TRUE; Zeichne (0,0);
Stange [35][30].Temp := MaxTemp; Stange[35][30].Farbe := 31;
Stange [35][30].reserved := TRUE; Zeichne (35,30);
Stange [10][30].Temp := MaxTemp; Stange[10][30].Farbe := 31;
Stange [10][30].reserved := TRUE; Zeichne (10,30);
Stange [30][27].Temp := MaxTemp; Stange[30][27].Farbe := 31;
Stange [30][27].reserved := TRUE; Zeichne (30,27);
Stange [25][15].Temp := MaxTemp; Stange[25][15].Farbe := 31;
Stange [25][15].reserved := TRUE; Zeichne (25,15);
FarbFak := Stange[0][0].Temp DIV 31;
FOR a:=0 TO 500 DO
FOR yy:=0 TO MaxSeg DO
FOR xx:=0 TO MaxSeg DO
IF NOT Stange[xx][yy].reserved THEN
TempHelp := Stange[xx][yy].Temp;
IF ((xx>0) AND (yy>0) AND (xx<MaxSeg) AND (yy<MaxSeg)) THEN
Stange [xx][yy].Temp :=
(Stange[xx-1][yy].Temp + Stange[xx+1][yy].Temp +
Stange[xx][yy-1].Temp + Stange[xx][yy+1].Temp +
Stange[xx-1][yy-1].Temp + Stange[xx-1][yy+1].Temp +
Stange[xx+1][yy-1].Temp + Stange[xx+1][yy+1].Temp) DIV 8;
ELSIF ((xx=0) AND (yy>0) AND (yy<MaxSeg)) THEN
Stange [xx][yy].Temp :=
(Stange[xx+1][yy].Temp + Stange[xx][yy-1].Temp + Stange[xx][yy+1].Temp +
Stange[xx+1][yy-1].Temp + Stange[xx+1][yy+1].Temp) DIV 5;
ELSIF ((xx>0) AND (xx<MaxSeg) AND (yy=0)) THEN
Stange [xx][yy].Temp :=
(Stange[xx+1][yy].Temp + Stange[xx-1][yy].Temp + Stange[xx][yy+1].Temp+
Stange[xx-1][yy+1].Temp + Stange[xx+1][yy+1].Temp) DIV 5;
ELSIF ((xx>0) AND (xx<MaxSeg) AND (yy=MaxSeg)) THEN
Stange [xx][yy].Temp :=
(Stange[xx+1][yy].Temp + Stange[xx-1][yy].Temp + Stange[xx][yy-1].Temp +
Stange[xx-1][yy-1].Temp + Stange[xx+1][yy-1].Temp) DIV 5;
ELSIF ((xx=MaxSeg) AND (yy>0) AND (yy<MaxSeg)) THEN
Stange [xx][yy].Temp :=
(Stange[xx][yy-1].Temp + Stange[xx][yy+1].Temp + Stange[xx-1][yy].Temp +
Stange[xx-1][yy-1].Temp + Stange[xx-1][yy+1].Temp) DIV 5;
ELSIF ((xx=MaxSeg) AND (yy=0)) THEN
Stange [xx][yy].Temp :=
(Stange[xx][yy+1].Temp + Stange[xx-1][yy].Temp +
Stange[xx-1][yy+1].Temp) DIV 3;
ELSIF ((xx=MaxSeg) AND (yy=MaxSeg)) THEN
Stange [xx][yy].Temp :=
(Stange[xx][yy-1].Temp + Stange[xx-1][yy].Temp +
Stange[xx-1][yy-1].Temp) DIV 3;
ELSIF ((xx=0) AND (yy=MaxSeg)) THEN
Stange [xx][yy].Temp :=
(Stange[xx][yy-1].Temp + Stange[xx+1][yy].Temp +
Stange[xx+1][yy-1].Temp) DIV 3;
END;
IF (TempHelp # Stange[xx][yy].Temp) THEN
Stange [xx][yy].Farbe := Stange [xx][yy].Temp DIV FarbFak;
IF Stange[xx][yy].Farbe = 0 THEN Stange[xx][yy].Farbe := 1 END;
Zeichne (xx, yy)
END (* if *)
ELSE
END (* if *)
END (* xx *)
END (* yy *)
END (* a *)
END Process;
PROCEDURE SegInit;
VAR xx, yy : INTEGER;
BEGIN
FOR yy:=0 TO MaxSeg DO
FOR xx:=0 TO MaxSeg DO
WITH Stange[xx][yy] DO
Temp := 0; Farbe := 1; reserved := FALSE;
x := 40+xx*3; dx := 42+xx*3; y := 30+yy*3; dy := 32+yy*3
END
END
END
END SegInit;
(* $E- *)
PROCEDURE Colors;
BEGIN
INLINE (0000H, 000FH, 010EH, 020DH, 030CH, 040BH, 050AH, 0609H,
0708H, 0807H, 0906H, 0A05H, 0B04H, 0C03H, 0D02H, 0E01H,
0F00H, 0F10H, 0F20H, 0F30H, 0F40H, 0F50H, 0F60H, 0F70H,
0F80H, 0F90H, 0FA0H, 0FB0H, 0FC0H, 0FD0H, 0FE0H, 0FF0H)
END Colors;
PROCEDURE Cleanup;
BEGIN
IF Level >= CurrentLevel() THEN
IF win#NIL THEN CloseWindow (win) END;
IF scr#NIL THEN CloseScreen (scr) END
END
END Cleanup;
PROCEDURE InitSys;
BEGIN
TermProcedure (Cleanup); Level := CurrentLevel();
scr := CreateScreen (WIDTH, HEIGHT, DEPTH, ViewModeSet{}, NIL, NIL);
win := CreateWindow (0,0, WIDTH, HEIGHT, IDCMPFlagSet{mouseButtons},
WindowFlagSet{borderless, activate, rmbTrap, noCareRefresh},
NIL, scr, NIL, customScreen);
vp := ADR (scr^.viewPort);
rp := ADR (scr^.rastPort);
LoadRGB4 (vp, ADR(Colors), 32);
END InitSys;
VAR x, y : INTEGER;
BEGIN (* HauptProgramm *)
InitSys;
FarbTest;
SegInit;
FOR x:=0 TO MaxSeg DO
FOR y:=0 TO MaxSeg DO
Zeichne (x, y)
END
END;
Process;
WaitPort (win^.userPort);
END Therm.